home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-08 | 9.1 KB | 435 lines | [TEXT/CWIE] |
- #include "ProblemUtils.h"
-
- #include <stdio.h>
- #include <string.h>
-
- const int buffer_size = 2000;
- static char buffer[buffer_size];
- static char buffer2[buffer_size];
-
- pascal OSErr ProblemFSRead( short rn, long reqsize, long *resultsize, char *data )
- {
- OSErr err;
- *resultsize = reqsize;
-
- err = FSRead( rn, resultsize, data );
- if ( err == eofErr && *resultsize > 0 ) {
- err = noErr;
- }
- return err;
- }
-
- pascal OSErr ProblemFSMustRead( short rn, long reqsize, char *data )
- {
- OSErr err;
- long resultsize = reqsize;
-
- err = FSRead( rn, &resultsize, data );
- if ( err == noErr && resultsize < reqsize ) {
- err = eofErr;
- }
- return err;
- }
-
- pascal OSErr ProblemFSWrite( short rn, long reqsize, char *data )
- {
- OSErr err;
- long savedsize;
-
- savedsize = reqsize;
- err = FSWrite( rn, &reqsize, data );
- if ( err == noErr && reqsize != savedsize ) {
- err = -1;
- }
- return err;
- }
-
- pascal OSErr ProblemCopyData( short frn, short trn )
- {
- OSErr err;
- long len;
-
- err = noErr;
- while ( err == noErr ) {
- err = ProblemFSRead( frn, buffer_size, &len, buffer );
- if ( err == eofErr ) {
- err = noErr;
- break;
- }
- if ( err == noErr ) {
- err = ProblemFSWrite( trn, len, buffer );
- }
- }
- return err;
- }
-
- pascal OSErr ProblemDuplicateFile( const FSSpec *from, const FSSpec *to )
- {
- OSErr err, err2;
- short frn, trn;
-
- (void) FSpDelete( to );
- err = FSpCreate( to, 'CWIE', 'TEXT', 0 );
- if ( err == noErr ) {
- err = FSpOpenDF( from, fsRdPerm, &frn );
- if ( err == noErr ) {
- err = FSpOpenDF( to, fsWrPerm, &trn );
- if ( err == noErr ) {
- err = ProblemCopyData( frn, trn );
- err2 = FSClose( trn );
- if ( err == noErr ) {
- err = err2;
- }
- }
- (void) FSClose( frn );
- }
- }
- if ( err != noErr ) {
- (void) FSpDelete( to );
- }
- return err;
- }
-
- pascal OSErr ProblemDiffData( short rn1, short rn2 )
- {
- OSErr err, err1, err2;
- long len1, len2, i;
-
- err = noErr;
- while ( err == noErr ) {
-
- err1 = ProblemFSRead( rn1, buffer_size, &len1, buffer );
- err2 = ProblemFSRead( rn2, buffer_size, &len2, buffer2 );
-
- if ( err1 == eofErr && err2 == eofErr ) {
- break;
- }
- if ( err1 != noErr ) {
- err = err1;
- break;
- }
- if ( err2 != noErr ) {
- err = err2;
- break;
- }
- if ( len1 != len2 ) {
- err = eofErr;
- break;
- }
-
- for( i = 0; i < len1; i++ ) {
- if ( buffer[i] != buffer2[i] ) {
- break;
- }
- }
- if ( i != len1 ) {
- err = badFileFormat;
- break;
- }
- }
- return err;
- }
-
- pascal Boolean ProblemDiffFiles( const FSSpec *file1, const FSSpec *file2 )
- {
- OSErr err;
- short rn1, rn2;
-
- err = FSpOpenDF( file1, fsRdPerm, &rn1 );
- if ( err == noErr ) {
- err = FSpOpenDF( file2, fsRdPerm, &rn2 );
- if ( err == noErr ) {
- err = ProblemDiffData( rn1, rn2 );
- (void) FSClose( rn2 );
- }
- (void) FSClose( rn1 );
- }
- return err != noErr;
- }
-
- pascal OSErr ProblemGetTestDirectoryFSSpec( FSSpec *spec )
- {
- OSErr err;
- FCBPBRec fpb;
- CInfoPBRec pb;
- Str255 name;
- Str15 number;
-
- fpb.ioNamePtr = name;
- fpb.ioVRefNum = 0;
- fpb.ioRefNum = CurResFile();
- fpb.ioFCBIndx = 0;
- err = PBGetFCBInfoSync( &fpb );
- if ( err == noErr ) {
- pb.hFileInfo.ioNamePtr = name;
- pb.hFileInfo.ioVRefNum = fpb.ioFCBVRefNum;
- pb.hFileInfo.ioDirID = fpb.ioFCBParID;
- pb.hFileInfo.ioFDirIndex = -1;
- err = PBGetCatInfoSync( &pb );
- }
-
- if ( err == noErr ) {
- number[0] = 2;
- number[1] = name[9];
- number[2] = name[10];
- PLstrcpy( name, "\p:::Test Data Folder:Problem " );
- PLstrcat( name, number );
- PLstrcat( name, "\p Test Data:XXX" );
- err = FSMakeFSSpec( fpb.ioFCBVRefNum, fpb.ioFCBParID, name, spec );
- if ( err == fnfErr ) {
- err = noErr;
- }
- spec->name[0] = 0;
- }
- return err;
- }
-
- pascal OSErr ProblemGetTestSpecs( const FSSpec *testspec, long test,
- FSSpec *inputspec, FSSpec *correctspec, FSSpec *savedspec, FSSpec *outputspec )
- {
- OSErr err;
- Str15 number;
- FSSpec irrelevent;
-
- number[0] = 2;
- number[1] = '0' + test / 10;
- number[2] = '0' + test % 10;
-
- *inputspec = *testspec;
- PLstrcpy( inputspec->name, "\pTest" );
- PLstrcat( inputspec->name, number );
- *correctspec = *inputspec;
- *savedspec = *inputspec;
- *outputspec = *inputspec;
-
- PLstrcat( inputspec->name, "\p.input" );
- PLstrcat( correctspec->name, "\p.correct" );
- PLstrcat(savedspec->name, "\p.saved" );
- PLstrcat( outputspec->name, "\p.output" );
-
- (void) FSpDelete( outputspec );
- (void) FSpDelete( savedspec );
- err = FSMakeFSSpec( inputspec->vRefNum, inputspec->parID, inputspec->name, &irrelevent );
- if ( err == noErr ) {
- err = ProblemDuplicateFile( inputspec, savedspec );
- }
- return err;
- }
-
- pascal void ProblemLogError( OSErr err, const char *function )
- {
- if ( err != noErr ) {
- printf( "%s got error %d\n", function, err );
- }
- }
-
- pascal void ProblemRunEitherFileTests( RunFileTestProc runtest, RunSingleFileTestProc singleruntest )
- {
- OSErr err;
- FSSpec testspec, inputspec, correctspec, savedspec, outputspec;
- long test;
- Boolean correct;
-
- err = ProblemGetTestDirectoryFSSpec( &testspec );
- ProblemLogError( err, "GetTestDirectoryFSSpec" );
-
- if ( err == noErr ) {
- test = 1;
- while ( 1 ) {
- err = ProblemGetTestSpecs( &testspec, test, &inputspec, &correctspec, &savedspec, &outputspec );
- if ( err != noErr ) {
- if ( err != fnfErr ) {
- ProblemLogError( err, "GetTestSpecs" );
- }
- break;
- }
-
- printf( "Test %d\n", test );
- // Test
-
- if ( runtest != NULL ) {
- err = runtest( &savedspec, &outputspec );
- if ( err == noErr ) {
- correct = !ProblemDiffFiles( &correctspec, &outputspec );
- }
- } else {
- err = singleruntest( &savedspec, &outputspec, &correct );
- }
- if ( err != noErr ) {
- printf( "FAILED: Result returned %d!\n", err );
- } else if ( ProblemDiffFiles( &inputspec, &savedspec ) ) {
- printf( "FAILED: Modified Input Files!\n" );
- } else if ( !correct ) {
- printf( "FAILED: Incorrect result!\n" );
- } else {
- printf( "SUCCESS!\n" );
- }
- if ( ProblemDiffFiles( &inputspec, &savedspec ) ) {
- err = ProblemDuplicateFile( &savedspec, &inputspec );
- }
- (void) FSpDelete( &savedspec );
-
- test++;
- }
- }
- }
-
- pascal void ProblemRunFileTests( RunFileTestProc runtest )
- {
- ProblemRunEitherFileTests( runtest, NULL );
- }
-
- pascal void ProblemRunSingleFileTests( RunSingleFileTestProc runtest )
- {
- ProblemRunEitherFileTests( NULL, runtest );
- }
-
- pascal OSErr ProblemFileRead( const FSSpec* infile, Handle *data )
- {
- OSErr err;
- short rn;
- long filelen;
-
- *data = nil;
- err = FSpOpenDF( infile, fsRdPerm, &rn );
- if ( err == noErr ) {
- err = GetEOF( rn, &filelen );
- if ( err == noErr ) {
- *data = NewHandle( filelen );
- err = MemError();
- if ( err == noErr ) {
- HLock( *data );
- err = ProblemFSMustRead( rn, filelen, **data );
- HUnlock( *data );
- }
- }
- (void )FSClose( rn );
- }
- if ( err != noErr ) {
- DisposeHandle( *data );
- }
- return err;
- }
-
- pascal OSErr ProblemFileWrite( const FSSpec* outfile, Handle data )
- {
- OSErr err, err2;
- short rn;
-
- (void) FSpDelete( outfile );
- (void) FSpCreate( outfile, 'CWIE', 'TEXT', 0 );
- err = FSpOpenDF( outfile, fsWrPerm, &rn );
- if ( err == noErr ) {
- HLock( data );
- err = ProblemFSWrite( rn, GetHandleSize( data ), *data );
- HUnlock( data );
- err2 = FSClose( rn );
- if ( err == noErr ) {
- err = err2;
- }
- }
- return err;
- }
-
- pascal Boolean ProblemReadLineFromHandle( Handle data, char *line, long linelen )
- {
- long datalen = GetHandleSize( data );
- char *p = *data;
- char *datafin = p + datalen;
- long actlinelen;
-
- if ( datalen == 0 ) return false;
-
- while ( *p != '\r' && p < datafin ) p++;
- actlinelen = p - *data;
- actlinelen = actlinelen < linelen ? actlinelen : linelen - 1;
- BlockMoveData( *data, line, actlinelen );
- line[actlinelen] = 0;
- if ( p < datafin ) p++;
- (void) Munger( data, 0, nil, p - *data, &data, 0); // Delete line from start of handle
- return true;
- }
-
- pascal OSErr ProblemWriteLineToHandle( Handle data, char *line )
- {
- OSErr err;
-
- err = ProblemWriteStringToHandle( data, line );
- if ( err == noErr ) {
- err = ProblemWriteStringToHandle( data, "\r" );
- }
- return err;
- }
-
- pascal OSErr ProblemWriteStringToHandle( Handle data, char *line )
- {
- OSErr err;
-
- err = PtrAndHand( line, data, strlen(line) );
- return err;
- }
-
- pascal void ProblemP2CString( void *line )
- {
- unsigned char *p = (unsigned char *)line;
- long len = *p;
-
- BlockMoveData( p + 1, p, len );
- p[len] = 0;
- }
-
- pascal void ProblemC2PString( void *line )
- {
- char *p = (char *)line;
- long len = strlen(p);
-
- len = len <= 255 ? len : 255;
-
- BlockMoveData( p, p + 1, len );
- p[0] = len;
- }
-
- pascal Boolean ProblemGetUInt32( char **line, UInt32 *number )
- {
- char numbers[20];
-
- ProblemGetCString( line, numbers, 20 );
- return sscanf( numbers, "%ld", number ) == 1;
- }
-
- pascal Boolean ProblemGetSInt32( char **line, SInt32 *number )
- {
- char numbers[20];
-
- ProblemGetCString( line, numbers, 20 );
- return sscanf( numbers, "%ld", number ) == 1;
- }
-
- pascal void ProblemGetString( char **line, StringPtr field )
- {
- char *p;
-
- p = *line;
- while ( *p != 0 && *p != ',' ) p++;
- field[0] = p - *line;
- BlockMoveData( *line, &field[1], field[0] );
- if ( *p ) p++;
- *line = p;
- }
-
- pascal void ProblemGetCString( char **line, char *field, long fieldlen )
- {
- char *p;
- long len;
-
- p = *line;
- while ( *p != 0 && *p != ',' ) p++;
- len = p - *line;
- len = len < fieldlen ? len : fieldlen - 1;
- BlockMoveData( *line, field, len );
- field[len] = 0;
- if ( *p ) p++;
- *line = p;
- }
-
-